package com.test16_内部类;

import org.junit.Test;

/**
 * 内部类
 * 优点：方便访问外部类中的私有操作结构
 * 缺点：破坏了程序的完整结构
 * 1、内部类与外部类之间，可以直接进行私有操作的访问
 * 2、内部类实例化格式：外部类.内部类 内部类对象 = new 外部类().new 内部类()
 * 3、内部类不希望被外部所访问，那么内部类使用private声明
 * 4、内部类访问外部类的成员属性，应使用：外部类.this.属性
 * 5、内部类(接口、抽象类)都可以在任意的结构中随意定义
 */
public class YootkDemo_01 {

    @Test
    public void test1() {
        // new Outer().fun();
        new Outer2().fun();
    }

    @Test
    public void test2() {
        new Outer().fun();
    }

    @Test
    public void test3() {
        // 内部类对象实例化
        Outer out = new Outer();
        Outer.Inner in = out.new Inner();
        in.printMessage();
    }
}

class Outer {   // 外部类
    private String message = "沐言优拓：www.youtk.com";

    class Inner {   // 内部类
        private String edu = "李兴华编程训练营：yootk.ke.qq.com";

        public void printMessage() {
            System.out.println("【内部类" + super.toString() + "】" + Outer.this.message);
        }
    }

    public void fun() {
        Inner in = new Inner();
        in.printMessage();
        System.out.println("【外部类" + super.toString() + "】" + in.edu);
    }
}

/**
 * 不使用内部类，实现相同功能
 */
class Outer2 {
    private String message = "沐言优拓：www.youtk.com";

    public String getMessage() {
        return this.message;
    }

    public void fun() {
        new Inner2(this).printMessage();
    }
}

class Inner2 {
    private Outer2 outer;

    public Inner2(Outer2 outer) {
        this.outer = outer;
    }

    public void printMessage() {
        System.out.println(this.outer.getMessage());
    }
}
